import tkinter as tk
import random
import json

# 初始化机器人列表
robots = []
size = 10
eat = 4  # 修改这个参数观察剩余机器人数量

# 随机生成机器人
for i in range(size):
    # 格式
    gene = {}
    # 1 是善良，0 是自私
    help_value = 1 if random.random() > 0.5 else 0
    gene['help'] = help_value
    gene['power'] = 2  # 初始电源 2 块
    gene['good'] = 0  # 贡献值
    # 添加到种群中
    robots.append(gene)

# 创建主窗口
root = tk.Tk()
root.title("共同利益优先（助人为乐）")

# 创建标签显示天数
days_label = tk.Label(root, text="第 0 天")
days_label.pack()
tk.Label(root, text="help=1是善良的机器人，help=0是自私的机器人").pack()
# 创建文本框显示机器人信息
show_text = tk.Text(root)
show_text.pack()
show_text.insert(tk.END, json.dumps(robots))

# 循环次数
max_days = 1

def robot_day():
    global max_days, days_label, show_text
    days_label.config(text=f"第 {max_days} 天")
    show_text.delete(1.0, tk.END)
    show_text.insert(tk.END, json.dumps(robots))

    if len(robots) < 2 or max_days > 30:
        return  # 停止
    # 复制机器人列表，避免在遍历过程中修改原列表
    robots_to_remove = []
    for i in range(len(robots)):
        print(robots[i], len(robots))
        mun = random.randint(0, 9)
        # 获得新的能源块
        robots[i]['power'] += mun
        # 减去每天消耗的能源块
        robots[i]['power'] -= eat
        # 如果能源块为空，这表示消亡
        if robots[i]['power'] < 0:
            robots_to_remove.append(i)
    # 移除消亡的机器人
    for index in sorted(robots_to_remove, reverse=True):
        robots.pop(index)
    # 善良的好运机器人还是行善
    for j in range(len(robots)):
        # 可以选择捐出去一半，或者只保留一部分
        # 这里选择留下 3 天的能量块
        if robots[j]['help'] == 1 and robots[j]['power'] > 3 * eat:
            # 最合理的办法是选择最需要帮助的人
            helps = robots[j]['power'] - 3 * eat
            for k in range(len(robots)):
                # 这里选择帮助能量块小于每天供应量的机器人
                if robots[k]['power'] < eat:
                    robots[k]['power'] += 1  # 每人 1 块，分完为止
                    helps -= 1
                    if helps < 1:
                        break
            robots[j]['power'] = 3 * eat  # 善良的机器人只剩下 3 * eat 块
    max_days += 1
    root.after(1000, robot_day)

# 启动机器人日常函数
robot_day()

# 运行主循环
root.mainloop()